package com.liuyc.lib.tools

import android.os.Handler
import android.os.Looper
import androidx.lifecycle.MutableLiveData

object LiveDataUtils {

    private val mHandler: Handler by lazy {
        Handler(Looper.getMainLooper())
    }

    /**
     * 处理当使用 post 传值的时候，多次调用 post 进行传值 数据只显示最后一条的问题
     * 主要问题在于 liveData 在 post 执行线程调度之前 是先判断 mPendingData 的值是否被消耗
     * 如果没有被消耗，就只会将此次的值赋予 mPendingData ，这样很可能出现我们连续发了两个消息
     * 而我们只收到最后一个的错觉
     *
     */
    fun <T> postValue(liveData: MutableLiveData<T>, data: T) {
        mHandler.post(SetValueRunnable.create(liveData, data))
    }


    private class SetValueRunnable<T> private constructor(private val liveData: MutableLiveData<T>, private val data: T) : Runnable {

        companion object{
            fun <T> create(liveData: MutableLiveData<T>, data: T): SetValueRunnable<T>{
                return SetValueRunnable(liveData, data)
            }
        }

        override fun run() {
            liveData.setValue(data)
        }
    }

}